/*
 * PoleaFisica.cpp
 *
 *  Created on: 02/11/2013
 *      Author: Juliansci
 */



#include "PoleaFisica.h"
#include <iostream>

typedef struct InfoEntidad {
   string *nombre;
   EntidadFisica *elemento;
} InfoEntidad;

PoleaFisica::PoleaFisica(b2World* world, float x, float y,float ancho, float alto, string tipo) :  EntidadFisica(tipo) {

	this->definicionCuerpoFisico = new b2BodyDef();
	this->definicionCuerpoFisico->position.Set(x, y);
	this->definicionCuerpoFisico->angle = 0;
	this->cuerpoFisico = world->CreateBody(definicionCuerpoFisico);

	b2CircleShape circulo;

	circulo.m_radius = ancho/2;

	this->fixture = new b2FixtureDef();
	this->fixture->shape = &circulo;
	this->fixture->density = 0.0f;
	this->fixture->isSensor = true;

	this->cuerpoFisico->CreateFixture(this->fixture);

	this->guardarInformacionDeEntidad();
	this->alto = alto;
	this->ancho = ancho;
	this->joint = NULL;

}

void PoleaFisica::jointear(b2World* world){
	b2PulleyJointDef defPolea;



	float altoCuerpo1 = this->aJointearInicial->getAlto()/2;
	float altoCuerpo2 = this->aJointearFinal->getAlto()/2;

	cout<<"inicial :"<<(*((InfoEntidad*)(aJointearInicial->obtenerCuerpo()->GetUserData()))->nombre)<<endl;
	cout << "final :"<< (*((InfoEntidad*) (aJointearFinal->obtenerCuerpo()->GetUserData()))->nombre)<<endl;

	float xCuerpo1, xCuerpo2, yCuerpo1, yCuerpo2;
	b2Body* cuerpoIzq, *cuerpoDer;

	//levanto el carrito y el balancin con la polea (falta determinar de que lado enchufo la cuerda) ://

	if (this->aJointearInicial->getTipo().compare("balancin") == 0){
		BalancinFisica* balancinFisica = (BalancinFisica*)this->aJointearInicial;
		cuerpoIzq = balancinFisica->obtenerCuerpo();
		if (this->aJointearInicial->entidadDerecha  == this->entidadIzquierda){
			cout<<"entro en balancin izquierda, lado derecho"<<endl;
			xCuerpo1 = cuerpoIzq->GetPosition().x+10;
			yCuerpo1 = cuerpoIzq->GetPosition().y;
		}

		if (this->aJointearInicial->entidadIzquierda  == this->entidadIzquierda){
			cout<<"entro en balancin izquierda, lado izquierdo"<<endl;
			xCuerpo1 = cuerpoIzq->GetPosition().x-10;
			yCuerpo1 = cuerpoIzq->GetPosition().y;
		}
	}

	else if (this->aJointearInicial->getTipo().compare("carrito") == 0){
		CarritoFisica* carritoFisica = (CarritoFisica*)this->aJointearInicial;
		cuerpoIzq = carritoFisica->obtenerCuerpo();
		if (this->aJointearInicial->entidadDerecha  == this->entidadIzquierda){
			xCuerpo1 = cuerpoIzq->GetPosition().x+5;
			yCuerpo1 = cuerpoIzq->GetPosition().y-4;

		}
		if (this->aJointearInicial->entidadIzquierda  == this->entidadIzquierda){
			xCuerpo1 = cuerpoIzq->GetPosition().x-5;
			yCuerpo1 = cuerpoIzq->GetPosition().y-4;
		}
	}

	else{
		cuerpoIzq = this->aJointearInicial->obtenerCuerpo();
		xCuerpo1 = this->aJointearInicial->obtenerCuerpo()->GetPosition().x;
		yCuerpo1 = this->aJointearInicial->obtenerCuerpo()->GetPosition().y;
	}

	if (this->aJointearFinal->getTipo().compare("balancin") == 0){
		BalancinFisica* balancinFisica = (BalancinFisica*)this->aJointearFinal;
		cuerpoDer = balancinFisica->obtenerCuerpo();
		if (this->aJointearFinal->entidadDerecha  == this->entidadDerecha){
			xCuerpo2 = cuerpoDer->GetPosition().x+10;
			yCuerpo2 = cuerpoDer->GetPosition().y;
		}
		if (this->aJointearFinal->entidadIzquierda  == this->entidadDerecha){
			xCuerpo2 = cuerpoDer->GetPosition().x-10;
			yCuerpo2 = cuerpoDer->GetPosition().y;
		}
	}

	else if (this->aJointearFinal->getTipo().compare("carrito") == 0){
		CarritoFisica* carritoFisica = (CarritoFisica*)this->aJointearFinal;
		cuerpoDer = carritoFisica->obtenerCuerpo();
		if (this->aJointearFinal->entidadDerecha  == this->entidadDerecha){
			xCuerpo2 = cuerpoDer->GetPosition().x+7;
			yCuerpo2 = cuerpoDer->GetPosition().y;

		}
		if (this->aJointearFinal->entidadIzquierda  == this->entidadDerecha){
			xCuerpo2 = cuerpoDer->GetPosition().x-7;
			yCuerpo2 = cuerpoDer->GetPosition().y;
		}

	}

	else{
		cuerpoDer = this->aJointearFinal->obtenerCuerpo();
		xCuerpo2 = this->aJointearFinal->obtenerCuerpo()->GetPosition().x;
		yCuerpo2 = this->aJointearFinal->obtenerCuerpo()->GetPosition().y;
	}

	float dSoga1 = abs(cuerpoIzq->GetPosition().y-this->cuerpoFisico->GetPosition().y) - altoCuerpo1/2 ;
	float dSoga2 = abs(cuerpoDer->GetPosition().y-this->cuerpoFisico->GetPosition().y) - altoCuerpo2/2 ;

	float xIni = this->aJointearInicial->getAnclajePolea().first - this->aJointearInicial->getAncho()/2;
	float xFin = this->aJointearFinal->getAnclajePolea().first + this->aJointearFinal->getAncho()/2;

	b2Vec2 anclaje_inicial(xCuerpo1 , yCuerpo1 + altoCuerpo1 );
	b2Vec2 anclaje_inicial2(xCuerpo2, yCuerpo2 + altoCuerpo2 );
	b2Vec2 anclaje_final(xIni ,  yCuerpo1 - altoCuerpo1/2 + dSoga1);
	b2Vec2 anclaje_final2(xFin , yCuerpo2 - altoCuerpo2/2 + dSoga2);

	defPolea.Initialize(cuerpoIzq, cuerpoDer, anclaje_final, anclaje_final2, anclaje_inicial, anclaje_inicial2, 1.0f);

	this->joint = (b2PulleyJoint*)world->CreateJoint(&defPolea);
}

void PoleaFisica::destruirEntidadFisica(){
	if (this->joint){
		cout<<"rompo polea"<<endl;
		b2World* world = this->cuerpoFisico->GetWorld();
		world->DestroyJoint(this->joint);
		this->joint=NULL;
	}
}

void PoleaFisica::setJoint(b2PulleyJoint* refJoint){
	this->joint = refJoint;
}

b2PulleyJoint* PoleaFisica::getJoint(){
	return this->joint;
}


PoleaFisica::~PoleaFisica() {
	// TODO Auto-generated destructor stub
}

